package com.zrf.base.knowledge.leetcode.editor.cn;

/**
 * //反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
 * //
 * // 说明:
 * //1 ≤ m ≤ n ≤ 链表长度。
 * //
 * // 示例:
 * //
 * // 输入: 1->2->3->4->5->NULL, m = 2, n = 4
 * //输出: 1->4->3->2->5->NULL
 * // Related Topics 链表
 * // 👍 558 👎 0
 *
 * @author zhouruifeng
 * @date 2020-10-27 07:26:17
 */
public class ReverseLinkedListIi {
    public static void main(String[] args) {
        ReverseLinkedListIi reverseLinkedListIi = new ReverseLinkedListIi();
        Solution solution = reverseLinkedListIi.new Solution();
        ListNode listNode = reverseLinkedListIi.new ListNode(1);
        listNode.next = reverseLinkedListIi.new ListNode(2);
        listNode.next.next = reverseLinkedListIi.new ListNode(3);
        listNode.next.next.next = reverseLinkedListIi.new ListNode(4);
        listNode.next.next.next.next = reverseLinkedListIi.new ListNode(5);
        listNode.next.next.next.next.next = reverseLinkedListIi.new ListNode(6);
        solution.reverseBetween(listNode, 1, 2);

        System.out.println(listNode);

    }
    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     * int val;
     * ListNode next;
     * ListNode(int x) { val = x; }
     * }
     */

    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
        }

        @Override
        public String toString() {
            return val + "->" + next;
        }
    }

    class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            if (head == null) {
                return null;
            }

            ListNode listNodeMPre = head;
            ListNode listNodeM = listNodeMPre.next;
            int i = 1;
            while (i < m) {
                listNodeM = listNodeMPre.next;
                listNodeMPre = listNodeMPre.next;
                i++;
            }
            ListNode listNodeStart = listNodeMPre.next;
            ListNode tmp = listNodeStart.next;
            ListNode listNodeNNext= tmp.next;
            while(i < n) {
                listNodeNNext= tmp.next;
                tmp.next = listNodeStart;
                i++;
            }

            listNodeMPre.next = tmp;
            listNodeM.next = listNodeNNext;

            return head;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}